package cn.gzsxt.utils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;

import com.alibaba.fastjson.JSON;

import cn.gzsxt.vo.MsgObj;

@WebServlet("/fileUpload.gzsxt")
public class FileUpoladUtil extends HttpServlet {
	private static final long serialVersionUID = 1L;
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//设置响应的MIME类型和字符编码
		resp.setContentType("application/json;charset=utf-8");
		//检查文件上传的req请求对象是否和合法(表单post,必须有contentType,而且必须是以multipart/为前缀)
		boolean isMultipart = ServletFileUpload.isMultipartContent(req);
		if(isMultipart){
			try {
				//创建一个 处理FileItem的工程对象,处理基本磁盘(不能处理上传的文件) 
				DiskFileItemFactory factory = new DiskFileItemFactory();
				// 设置缓存大小 单位 字节 如：设置 缓存500kb 500*1204
				//设置上传的缓存大小
				factory.setSizeThreshold(500*1204);
				
				// 设置临时目录,默认临时目录在 Tomcat根/temp
				factory.setRepository(new File("c:/temp"));

				//创建一个新的文件上传处理器 (基于基本的工厂对象):装饰者(包装)设计模式
				ServletFileUpload upload = new ServletFileUpload(factory);
				
				//设置单个文件的大小限制 :单位字节  bytes
				upload.setFileSizeMax(300 * 1024);
				
				//设置完整请求的文件大小 :单位字节  bytes
				upload.setSizeMax(400 * 1024);

				// 解析请求
				List<FileItem> items = upload.parseRequest(req);
				
				for (FileItem fileItem : items) {
					//获取表单的名称
					String fieldName = fileItem.getFieldName();
					//System.out.println(fieldName);
					
					if(fileItem.isFormField()){//普通表单元素
						//获取普通表单元素的值
						String value = fileItem.getString("utf-8");
						System.out.println(value);
						
					}else{//文件上传控件 file
						//获取上传文件的名称
						String fileName = fileItem.getName();//ergou.png
						System.out.println(fileName);
						

						//使用uuid上传文件的新文件名
						String uuid = UUID.randomUUID().toString().replaceAll("-", "");
						
						//使用FilenameUtils获取文件的后缀名
						String extension = FilenameUtils.getExtension(fileName);
						
						//创建的新的文件名称
						String newFileName = uuid+"."+extension;
						
						
						//获取文件上传的MIME类型
						String contentType = fileItem.getContentType();
						System.out.println(fileName);
						//获取文件的输入流
						InputStream inputStream = fileItem.getInputStream();
						
						//获取项目的真实路径(磁盘路径)--把上传的文件先临时(后期高级会专门搭建图片服务器)放在 项目的 根路径(WebRoot)下面的一个upload目录下面
						String realPath = req.getServletContext().getRealPath("/upload")+"/";
						System.out.println(realPath);
					
						File destFile = new File(realPath);
						//判断是否有此目录,没有使用程序创建一个
						if(!destFile.exists()){
							destFile.mkdir();
						}
						//创建一个输出流:用于保存上传文件
						OutputStream outputStream = new FileOutputStream(new File(destFile,newFileName));
						
						//将流保存到磁盘具体某一个位置
						IOUtils.copy(inputStream, outputStream);
						
						//成功: 返回 状态码1 和 图片的 相对路径的地址 
						MsgObj msgObj = new MsgObj(1,"/upload/"+newFileName);
						
						resp.getWriter().print(JSON.toJSONString(msgObj));
						
					}
					
				}
			}catch (Exception e) {
				MsgObj msgObj = new MsgObj(0,"服务器异常,稍后再试!!!");
				resp.getWriter().print(JSON.toJSONString(msgObj));
				System.out.println("异常");
				e.printStackTrace();
			}
			
		}
	}
}
